package com.zhibang.annotation;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.zhibang.mapper.DictDataMapper;
import com.zhibang.service.DictDataService;
import com.zhibang.util.Result;
import lombok.SneakyThrows;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 *字典切面类
 * @date 2020/11/26 0026
 */
@Aspect//切面类
@Component//注册为Spring Bean
public class DictAspect {
    @Around("@annotation(com.zhibang.annotation.DictQuery)")
    public Object myPointcut(ProceedingJoinPoint jp) throws Throwable {
        //处理字典查询
        Object result = jp.proceed();
//        判断控制器的返回值类型是不是Result
        if (result instanceof Result){
            Result r=(Result) result;
            //判断查询到的数据类型
            if (r.getData() instanceof IPage){
                IPage page=(IPage)r.getData();
                page.convert((o)->parseObject(o));
                r.setData(page);
            }else if (r.getData() instanceof List){
                List list = (List)r.getData();
                List<JSONObject> list2=new ArrayList<>();
                for (Object o : list) {
                    list2.add(parseObject(o));
                }
                r.setData(list2);
            }else{//一个对象
                JSONObject object = parseObject(r.getData());
                r.setData(object);
            }
            return r;
        }
        return result;
    }

    @Resource
    DictDataService dds;

    //解析对象，处理字典属性
    @SneakyThrows
    public JSONObject parseObject(Object obj){
        if(obj==null)return null;
        JSONObject result = new JSONObject();
        //      反射获取         类中的       所有属性
        Field[] fields = obj.getClass().getDeclaredFields();
//        遍历属性
        for (Field field : fields){
            //开启暴力访问
            field.setAccessible(true);
//            判断是否有Dict注解
            Dict dict = field.getAnnotation(Dict.class);
            if(dict!=null){
//                使用了字典的属性，就去数据库查询对应的label
                Object label = dds.getLabelByCode(dict.code(), field.get(obj));
                result.put(field.getName()+"Dict",label);
            }
//            实体类中的每个属性,都返回
            result.put(field.getName(),field.get(obj));
        }
        return result;
    }

}
